package br.com.equus.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.arquitetura.util.Mascara;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.AvaliacaoAnimal;
import br.com.equus.entidade.TipoAvalicao;
import br.com.equus.entidade.Usuario;
import br.com.equus.service.UsuarioService;
import br.com.equus.util.Constantes;
import br.com.equus.util.ValidacaoUtil;

@ManagedBean(name = "avaliacaoAnimalBean")
@ViewScoped
public class AvaliacaoAnimalBean extends PaginableBean<AvaliacaoAnimal> {

	private static final long serialVersionUID = 1L;

	private Usuario userAvaliacao;
	private Integer idAvaliacaoCasco;
	private Integer idAvaliacaoDenticao;
	private List<SelectItem> listaTipoAvaliacao;
	private Animal animal;

	@ManagedProperty(value = "#{usuarioService}")
	protected UsuarioService usuarioService;

	public AvaliacaoAnimalBean() {
	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_AVALIACAO");

	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {
			Integer idAnimal = (Integer) getSessionMap().remove("idAnimal");
			if (idAnimal != null) {
				animal = (Animal) universalManager.get(Animal.class, idAnimal);
			}

			listaTipoAvaliacao = ComboUtil.getItens(universalManager.listBy(new TipoAvalicao(true)));
			Collections.sort(listaTipoAvaliacao, new Comparator<SelectItem>() {
				@Override
				public int compare(SelectItem o1, SelectItem o2) {
					return o1.getLabel().compareTo(o2.getLabel());
				}
			});
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@SuppressWarnings("unchecked")
	public String limparTela() {
		getSessionMap().put("idAnimal", animal.getId());
		return redirect("avaliacaoAnimal.jsf");
	}

	@SuppressWarnings("unchecked")
	public List<Usuario> completeUsuario(String query) {
		List<Usuario> sugestoes = new ArrayList<Usuario>();
		Usuario a = new Usuario();
		a.setNome(query);
		try {
			sugestoes = usuarioService.completeUsuarioAtivo(a);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	@Override
	public String load() {
		try {
			super.load();
			userAvaliacao = getModel().getUsuario();
			idAvaliacaoCasco = getModel().getAvaliacaoCasco().getId();
			idAvaliacaoDenticao = getModel().getAvaliacaoDenticao().getId();
			getModel().setPesoToString(getModel().getPeso().toString());
			getModel().setCincurferenciaToString(getModel().getCincurferencia().toString());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	@Override
	public String save() {
		try {

			if (userAvaliacao == null || userAvaliacao.getId() == null) {
				FacesMessagesUtil.addErrorMessage("Usuário ", Constantes.CAMPO_OBRIGATORIO);
				return ERROR;
			}
			if (ValidacaoUtil.doubleValido(getModel().getPesoToString())) {
				getModel().setPeso(Mascara.marcarDouble(getModel().getPesoToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Peso ", " Está em um formato incorreto");
				return ERROR;
			}
			if (ValidacaoUtil.doubleValido(getModel().getCincurferenciaToString())) {
				getModel().setCincurferencia(Mascara.marcarDouble(getModel().getCincurferenciaToString()));
			} else {
				FacesMessagesUtil.addErrorMessage("Circ. Toráxica ", " Está em um formato incorreto");
				return ERROR;
			}

			getModel().setUsuario(userAvaliacao);
			getModel().setAvaliacaoCasco((TipoAvalicao) universalManager.get(TipoAvalicao.class, idAvaliacaoCasco));
			getModel().setAvaliacaoDenticao((TipoAvalicao) universalManager.get(TipoAvalicao.class, idAvaliacaoDenticao));
			getModel().setAnimal(new Animal(animal.getId()));

			if (getModel().getId() == null) {
				getModel().setDtCadastro(new Date());
			}

			super.save();

			setModel(new AvaliacaoAnimal());
			idAvaliacaoCasco = null;
			idAvaliacaoDenticao = null;
			userAvaliacao = new Usuario();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		return SUCCESS;
	}

	@Override
	public AvaliacaoAnimal createModel() {
		return new AvaliacaoAnimal();
	}

	@Override
	public String getQualifiedName() {
		return "Avaliaçao Animal";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		if (animal != null && animal.getId() != null) {
			this.filters.put("animal.id", animal.getId().toString());
		} else {
			this.filters.put("animal.id", "0");
		}
		return this.filters;
	}

	public Usuario getUserAvaliacao() {
		return userAvaliacao;
	}

	public void setUserAvaliacao(Usuario userAvaliacao) {
		this.userAvaliacao = userAvaliacao;
	}

	public Integer getIdAvaliacaoCasco() {
		return idAvaliacaoCasco;
	}

	public void setIdAvaliacaoCasco(Integer idAvaliacaoCasco) {
		this.idAvaliacaoCasco = idAvaliacaoCasco;
	}

	public Integer getIdAvaliacaoDenticao() {
		return idAvaliacaoDenticao;
	}

	public void setIdAvaliacaoDenticao(Integer idAvaliacaoDenticao) {
		this.idAvaliacaoDenticao = idAvaliacaoDenticao;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public List<SelectItem> getListaTipoAvaliacao() {
		return listaTipoAvaliacao;
	}

	public void setListaTipoAvaliacao(List<SelectItem> listaTipoAvaliacao) {
		this.listaTipoAvaliacao = listaTipoAvaliacao;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

}
